/**
 * 文件名：AppController.java
 * 功能：应用程序信息管理接口控制器
 * 作用：提供应用列表查询、分类筛选、评分排序、下载量排序等 RESTful API
 * 模块关系：
 *   - 依赖 AppMapper ：通过 MyBatis 访问数据库获取应用数据
 *   - 依赖 AppEntity ：数据库实体类，表示 t_app 表的数据结构
 *   - 依赖 AppVO ：视图对象，用于封装返回给前端的数据
 *   - 依赖 ApiResponse ：统一响应格式封装
 *   - 供前端 Vue3 和微信小程序调用，实现多端应用列表展示
 * 作者：白永康
 * 学号：2501210209
 */
package com.example.demo.app;

import com.example.demo.common.ApiResponse;
import com.example.demo.app.vo.AppVO;
import com.example.demo.app.entity.AppEntity;
import com.example.demo.app.mapper.AppMapper;
import org.springframework.web.bind.annotation.*;
import java.util.*;

/**
 * 应用程序信息控制器
 * 处理应用相关的 HTTP 请求，包括查询、筛选、排序等功能
 */
@RestController
@RequestMapping("/api/apps")
public class AppController {
    private final AppMapper appMapper;

    /**
     * 构造函数，注入 AppMapper 依赖
     * @param appMapper MyBatis Mapper 接口，用于数据库访问
     */
    public AppController(AppMapper appMapper) {
        this.appMapper = appMapper;
    }

    /**
     * 查询所有应用列表（按 ID 升序）
     * 路径：GET /api/apps
     * @return 统一响应格式，包含应用 VO 列表
     */
    @GetMapping
    public ApiResponse<List<AppVO>> list() {
        // 使用 MyBatis 查询数据库
        List<AppEntity> entities = appMapper.findAllOrderById();

        // 转换为 VO 对象
        List<AppVO> out = new ArrayList<>();
        for (AppEntity e : entities) {
            AppVO vo = AppVO.builder()
                    .id(e.getId())
                    .name(e.getName())
                    .description(e.getDescription())
                    .fullDescription(e.getFullDescription())
                    .avatar(e.getAvatar())
                    .category(e.getCategory())
                    .price(e.getPrice())
                    .rating(e.getRating())
                    .downloads(e.getDownloads())
                    .reviews(e.getReviews())
                    .author(e.getAuthor())
                    .publishedAt(e.getPublishedAt())
                    .build();
            out.add(vo);
        }
        return ApiResponse.ok(out);
    }

    /**
     * 根据分类查询应用列表
     * 路径：GET /api/apps/category/{category}
     * @param category 应用分类（如：工具、娱乐、教育等）
     * @return 统一响应格式，包含筛选后的应用 VO 列表
     */
    @GetMapping("/category/{category}")
    public ApiResponse<List<AppVO>> listByCategory(@PathVariable String category) {
        List<AppEntity> entities = appMapper.findByCategory(category);
        List<AppVO> out = new ArrayList<>();
        for (AppEntity e : entities) {
            AppVO vo = AppVO.builder()
                    .id(e.getId())
                    .name(e.getName())
                    .description(e.getDescription())
                    .fullDescription(e.getFullDescription())
                    .avatar(e.getAvatar())
                    .category(e.getCategory())
                    .price(e.getPrice())
                    .rating(e.getRating())
                    .downloads(e.getDownloads())
                    .reviews(e.getReviews())
                    .author(e.getAuthor())
                    .publishedAt(e.getPublishedAt())
                    .build();
            out.add(vo);
        }
        return ApiResponse.ok(out);
    }

    /**
     * 按评分降序排序查询应用列表
     * 路径：GET /api/apps/sort/rating
     * @return 统一响应格式，包含按评分降序排列的应用 VO 列表
     */
    @GetMapping("/sort/rating")
    public ApiResponse<List<AppVO>> listSortByRating() {
        List<AppEntity> entities = appMapper.findAllOrderByRatingDesc();
        List<AppVO> out = new ArrayList<>();
        for (AppEntity e : entities) {
            AppVO vo = AppVO.builder()
                    .id(e.getId())
                    .name(e.getName())
                    .description(e.getDescription())
                    .fullDescription(e.getFullDescription())
                    .avatar(e.getAvatar())
                    .category(e.getCategory())
                    .price(e.getPrice())
                    .rating(e.getRating())
                    .downloads(e.getDownloads())
                    .reviews(e.getReviews())
                    .author(e.getAuthor())
                    .publishedAt(e.getPublishedAt())
                    .build();
            out.add(vo);
        }
        return ApiResponse.ok(out);
    }

    /**
     * 按下载量降序排序查询应用列表
     * 路径：GET /api/apps/sort/downloads
     * @return 统一响应格式，包含按下载量降序排列的应用 VO 列表
     */
    @GetMapping("/sort/downloads")
    public ApiResponse<List<AppVO>> listSortByDownloads() {
        List<AppEntity> entities = appMapper.findAllOrderByDownloadsDesc();
        List<AppVO> out = new ArrayList<>();
        for (AppEntity e : entities) {
            AppVO vo = AppVO.builder()
                    .id(e.getId())
                    .name(e.getName())
                    .description(e.getDescription())
                    .fullDescription(e.getFullDescription())
                    .avatar(e.getAvatar())
                    .category(e.getCategory())
                    .price(e.getPrice())
                    .rating(e.getRating())
                    .downloads(e.getDownloads())
                    .reviews(e.getReviews())
                    .author(e.getAuthor())
                    .publishedAt(e.getPublishedAt())
                    .build();
            out.add(vo);
        }
        return ApiResponse.ok(out);
    }
}
